#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import tempfile
from pathlib import Path
from typing import Optional
import logging

logger = logging.getLogger(__name__)

class WorkDirConfig:
    """工作目录配置管理器"""
    
    _base_work_dir: Optional[Path] = None
    _initialized = False
    _debug_mode = False
    
    @classmethod
    def initialize(cls, custom_work_dir: Optional[str] = None) -> Path:
        """
        初始化工作目录配置
        
        Args:
            custom_work_dir: 自定义工作目录路径
            
        Returns:
            Path: 工作目录路径
        """
        if cls._initialized and cls._base_work_dir:
            return cls._base_work_dir
        
        # 优先级：参数 > 环境变量 > 默认临时目录
        work_dir_str = custom_work_dir or os.getenv('WORK_TEMP_DIR')
        
        if work_dir_str:
            work_dir = Path(work_dir_str)
            try:
                # 创建目录并测试写入权限
                work_dir.mkdir(parents=True, exist_ok=True)
                
                # 测试写入权限
                test_file = work_dir / ".test_write_permission"
                test_file.write_text("test")
                test_file.unlink()
                
                cls._base_work_dir = work_dir
                logger.info(f"使用配置的工作目录: {work_dir}")
                
            except (OSError, PermissionError) as e:
                logger.warning(f"无法使用配置的工作目录 {work_dir}: {e}，使用系统临时目录")
                cls._base_work_dir = Path(tempfile.gettempdir()) / "extractToMarkdown"
                cls._base_work_dir.mkdir(parents=True, exist_ok=True)
        else:
            # 使用系统临时目录
            cls._base_work_dir = Path(tempfile.gettempdir()) / "extractToMarkdown"
            cls._base_work_dir.mkdir(parents=True, exist_ok=True)
            logger.info(f"使用系统临时目录: {cls._base_work_dir}")
        
        cls._initialized = True
        return cls._base_work_dir
    
    @classmethod
    def set_debug_mode(cls, debug_mode: bool):
        """设置调试模式"""
        cls._debug_mode = debug_mode
        logger.info(f"工作目录调试模式设置为: {debug_mode}")
    
    @classmethod
    def get_base_work_dir(cls) -> Path:
        """获取基础工作目录"""
        if not cls._initialized:
            cls.initialize()
        if cls._base_work_dir is None:
            raise RuntimeError("工作目录初始化失败")
        return cls._base_work_dir
    
    @classmethod
    def create_file_work_dir(cls, file_id: str) -> Path:
        """
        为指定文件ID创建工作目录
        
        Args:
            file_id: 文件ID
            
        Returns:
            Path: 文件专用工作目录
        """
        base_dir = cls.get_base_work_dir()
        file_work_dir = base_dir / file_id
        file_work_dir.mkdir(parents=True, exist_ok=True)
        return file_work_dir
    
    @classmethod
    def create_converter_work_dir(cls, file_id: str, converter_name: str) -> Path:
        """
        为指定转换器创建工作目录
        
        Args:
            file_id: 文件ID
            converter_name: 转换器名称
            
        Returns:
            Path: 转换器专用工作目录
        """
        file_work_dir = cls.create_file_work_dir(file_id)
        converter_work_dir = file_work_dir / converter_name
        converter_work_dir.mkdir(parents=True, exist_ok=True)
        return converter_work_dir
    
    @classmethod
    def cleanup_file_work_dir(cls, file_id: str):
        """清理指定文件ID的工作目录"""
        try:
            file_work_dir = cls.get_base_work_dir() / file_id
            if file_work_dir.exists():
                import shutil
                shutil.rmtree(file_work_dir)
                logger.debug(f"已清理文件工作目录: {file_work_dir}")
        except Exception as e:
            logger.warning(f"清理文件工作目录失败: {e}")
    
    @classmethod
    def cleanup_all_work_dirs(cls):
        """清理所有工作目录"""
        try:
            if cls._base_work_dir and cls._base_work_dir.exists():
                import shutil
                shutil.rmtree(cls._base_work_dir)
                logger.info(f"已清理所有工作目录: {cls._base_work_dir}")
                # 重新创建基础目录
                cls._base_work_dir.mkdir(parents=True, exist_ok=True)
        except Exception as e:
            logger.warning(f"清理所有工作目录失败: {e}")
    
    @classmethod
    def get_status(cls) -> dict:
        """获取工作目录状态信息"""
        base_dir = cls.get_base_work_dir()
        
        try:
            # 统计子目录数量
            subdirs = [d for d in base_dir.iterdir() if d.is_dir()]
            
            # 计算总大小
            total_size = 0
            for item in base_dir.rglob('*'):
                if item.is_file():
                    try:
                        total_size += item.stat().st_size
                    except OSError:
                        pass
            
            return {
                'base_dir': str(base_dir),
                'exists': base_dir.exists(),
                'writable': os.access(base_dir, os.W_OK),
                'subdirs_count': len(subdirs),
                'total_size_mb': round(total_size / (1024 * 1024), 2),
                'subdirs': [d.name for d in subdirs[:10]]  # 只显示前10个
            }
        except Exception as e:
            return {
                'base_dir': str(base_dir),
                'exists': False,
                'error': str(e)
            }

# 全局工作目录配置实例
work_dir_config = WorkDirConfig() 